package cl.tinet.trainee.mb;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import cl.tinet.trainee.ejb.CarroBeanLocal;
import cl.tinet.trainee.model.CarroTO;
import cl.tinet.trainee.model.DatosMostrarTO;
import cl.tinet.trainee.model.DetalleCarroTO;
import cl.tinet.trainee.model.ProductoTO;
import cl.tinet.trainee.model.UsuarioTO;

@ManagedBean
@SessionScoped
public class CarroCompraMB implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private CarroBeanLocal servicio;

	private List<ProductoTO> lProducto;
	private ProductoTO productoTO;
	private UsuarioTO usuarioTO;	
	private DatosMostrarTO datosMostrarTO;
	private List<DetalleCarroTO> lDetalleCarro;

	@PostConstruct
	public void init() {

		inicializarInstancias();
		listarProductos();
	}

	/**
	 * Metodo encargado de listar los productos
	 * 
	 * @return a la vista index.xhtml
	 */
	public String listarProductos() {

		lProducto.addAll(servicio.listarProductos());
		return "index";
	}

	/**
	 * Metodo encargado de entregarle un objeto productoTO al Ejb para que lo
	 * agrege al carro de compras
	 */
	public void agregarProducto(ProductoTO productoTO){			
		datosMostrarTO = new DatosMostrarTO();
		 	datosMostrarTO = servicio.agregarProducto(productoTO);						
	}
	
	/**
	 * Metodo encargado de modificar los datos del carro
	 */
	public void editarCarro(){
		//lDetalleCarro = new ArrayList<DetalleCarroTO>();				
		
	}
	
	/**
	 * metodo encargado de obtener una lista de detalles
	 */
	public void obtenerDetalles(){	
		
		lDetalleCarro = new ArrayList<DetalleCarroTO>();				
		lDetalleCarro.addAll(servicio.cargarCarro().getlDetalleCarro());
					
	}
	
	/**
	 * Metodo encargado de aumentar en 1(+1) la cantidad de un producto
	 */
	public void agregarCantidad(DetalleCarroTO detalleCarroTO){		
		servicio.agregarCantidad(detalleCarroTO);	
		obtenerDetalles();
		calcularDatosParaMostrar();
	}
	
	/**
	 * Metodo encargado de restar en 1(-1) la cantidad de un producto
	 */
	public void restarCantidad(DetalleCarroTO detalleCarroTO){		
		servicio.restarCantidad(detalleCarroTO);
		obtenerDetalles();
		calcularDatosParaMostrar();
		
	}
	
	/**
	 * Metodo encargado de eliminar un detalle de carro
	 */
	public void eliminarDetalle(DetalleCarroTO detalleCarroTO){		
		servicio.eliminarDetalle(detalleCarroTO);
		obtenerDetalles();
		calcularDatosParaMostrar();
		
	}
	
	/**
	 * Metodo encargado de montar los datos que se mostraran por pantalla
	 */
	public void calcularDatosParaMostrar(){
	  datosMostrarTO = servicio.calcularDatosParaMostrar(lDetalleCarro);		
	}
	
	/**
	 * Metodo encargado de verificar si el usuario esta registrado en la base de datos
	 */
	public void identificarUsuario(){
		
		usuarioTO =  servicio.identificarUsuario(usuarioTO);
							
	}
	/**
	 * Metodo encargado de iniciarlizar las instancias que se usaran en la vista
	 */
	public void inicializarInstancias() {

		lProducto = new ArrayList<ProductoTO>();
		usuarioTO = new UsuarioTO();
	}
	
	/**
	 * @return the serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/**
	 * @return the lProducto
	 */
	public List<ProductoTO> getlProducto() {
		return lProducto;
	}

	/**
	 * @param lProducto
	 *            the lProducto to set
	 */
	public void setlProducto(List<ProductoTO> lProducto) {
		this.lProducto = lProducto;
	}

	/**
	 * @return the servicio
	 */
	public CarroBeanLocal getServicio() {
		return servicio;
	}

	/**
	 * @return the productoTO
	 */
	public ProductoTO getProductoTO() {
		return productoTO;
	}

	/**
	 * @param productoTO
	 *            the productoTO to set
	 */
	public void setProductoTO(ProductoTO productoTO) {
		this.productoTO = productoTO;
	}

	/**
	 * @return the usuarioTO
	 */
	public UsuarioTO getUsuarioTO() {
		return usuarioTO;
	}

	/**
	 * @param usuarioTO the usuarioTO to set
	 */
	public void setUsuarioTO(UsuarioTO usuarioTO) {
		this.usuarioTO = usuarioTO;
	}

	/**
	 * @param servicio the servicio to set
	 */
	public void setServicio(CarroBeanLocal servicio) {
		this.servicio = servicio;
	}

	/**
	 * @return the datosMostrarTO
	 */
	public DatosMostrarTO getDatosMostrarTO() {
		return datosMostrarTO;
	}

	/**
	 * @param datosMostrarTO the datosMostrarTO to set
	 */
	public void setDatosMostrarTO(DatosMostrarTO datosMostrarTO) {
		this.datosMostrarTO = datosMostrarTO;
	}

	/**
	 * @return the lDetalleCarro
	 */
	public List<DetalleCarroTO> getlDetalleCarro() {
		return lDetalleCarro;
	}

	/**
	 * @param lDetalleCarro the lDetalleCarro to set
	 */
	public void setlDetalleCarro(List<DetalleCarroTO> lDetalleCarro) {
		this.lDetalleCarro = lDetalleCarro;
	}
	
	

}
